/**
 * echarts日期运算格式化相关
 *
 * @desc echarts基于Canvas，纯Javascript图表库，提供直观，生动，可交互，可个性化定制的数据统计图表。
 * @author Kener (@Kener-林峰, kener.linfeng@gmail.com)
 *
 */


var _timeGap = [
    {
        formatter: 'hh : mm : ss',
        value: 1000
    },
    // 1s
    {
        formatter: 'hh : mm : ss',
        value: 1000 * 5
    },
    // 5s
    {
        formatter: 'hh : mm : ss',
        value: 1000 * 10
    },
    // 10s
    {
        formatter: 'hh : mm : ss',
        value: 1000 * 15
    },
    // 15s
    {
        formatter: 'hh : mm : ss',
        value: 1000 * 30
    },
    // 30s
    {
        formatter: 'hh : mm\nMM - dd',
        value: 60000
    },
    // 1m
    {
        formatter: 'hh : mm\nMM - dd',
        value: 60000 * 5
    },
    // 5m
    {
        formatter: 'hh : mm\nMM - dd',
        value: 60000 * 10
    },
    // 10m
    {
        formatter: 'hh : mm\nMM - dd',
        value: 60000 * 15
    },
    // 15m
    {
        formatter: 'hh : mm\nMM - dd',
        value: 60000 * 30
    },
    // 30m
    {
        formatter: 'hh : mm\nMM - dd',
        value: 3600000
    },
    // 1h
    {
        formatter: 'hh : mm\nMM - dd',
        value: 3600000 * 2
    },
    // 2h
    {
        formatter: 'hh : mm\nMM - dd',
        value: 3600000 * 6
    },
    // 6h
    {
        formatter: 'hh : mm\nMM - dd',
        value: 3600000 * 12
    },
    // 12h
    {
        formatter: 'MM - dd\nyyyy',
        value: 3600000 * 24
    },
    // 1d
    {
        formatter: 'week',
        value: 3600000 * 24 * 7
    },
    // 7d
    {
        formatter: 'month',
        value: 3600000 * 24 * 31
    },
    // 1M
    {
        formatter: 'quarter',
        value: 3600000 * 24 * 380 / 4
    },
    // 3M
    {
        formatter: 'half-year',
        value: 3600000 * 24 * 380 / 2
    },
    // 6M
    {
        formatter: 'year',
        value: 3600000 * 24 * 380
    }    // 1Y
];
/**
     * 获取最佳formatter
     * @params {number} min 最小值
     * @params {number} max 最大值
     * @params {=number} splitNumber 分隔段数
     */
function getAutoFormatter(min, max, splitNumber) {
    splitNumber = splitNumber > 1 ? splitNumber : 2;
    // 最优解
    var curValue;
    var totalGap;
    // 目标
    var formatter;
    var gapValue;
    for (var i = 0, l = _timeGap.length; i < l; i++) {
        curValue = _timeGap[i].value;
        totalGap = Math.ceil(max / curValue) * curValue - Math.floor(min / curValue) * curValue;
        if (Math.round(totalGap / curValue) <= splitNumber * 1.2) {
            formatter = _timeGap[i].formatter;
            gapValue = _timeGap[i].value;
            // console.log(formatter, gapValue,i);
            break;
        }
    }
    if (formatter == null) {
        formatter = 'year';
        curValue = 3600000 * 24 * 367;
        totalGap = Math.ceil(max / curValue) * curValue - Math.floor(min / curValue) * curValue;
        gapValue = Math.round(totalGap / (splitNumber - 1) / curValue) * curValue;
    }
    return {
        formatter: formatter,
        gapValue: gapValue
    };
}
/**
     * 一位数字补0 
     */
function s2d(v) {
    return v < 10 ? '0' + v : v;
}
/**
     * 百分比计算
     */
function format(formatter, value) {
    if (formatter == 'week' || formatter == 'month' || formatter == 'quarter' || formatter == 'half-year' || formatter == 'year') {
        formatter = 'MM - dd\nyyyy';
    }
    var date = getNewDate(value);
    var y = date.getFullYear();
    var M = date.getMonth() + 1;
    var d = date.getDate();
    var h = date.getHours();
    var m = date.getMinutes();
    var s = date.getSeconds();
    formatter = formatter.replace('MM', s2d(M));
    formatter = formatter.toLowerCase();
    formatter = formatter.replace('yyyy', y);
    formatter = formatter.replace('yy', y % 100);
    formatter = formatter.replace('dd', s2d(d));
    formatter = formatter.replace('d', d);
    formatter = formatter.replace('hh', s2d(h));
    formatter = formatter.replace('h', h);
    formatter = formatter.replace('mm', s2d(m));
    formatter = formatter.replace('m', m);
    formatter = formatter.replace('ss', s2d(s));
    formatter = formatter.replace('s', s);
    return formatter;
}
function nextMonday(value) {
    value = getNewDate(value);
    value.setDate(value.getDate() + 8 - value.getDay());
    return value;
}
function nextNthPerNmonth(value, nth, nmon) {
    value = getNewDate(value);
    value.setMonth(Math.ceil((value.getMonth() + 1) / nmon) * nmon);
    value.setDate(nth);
    return value;
}
function nextNthOnMonth(value, nth) {
    return nextNthPerNmonth(value, nth, 1);
}
function nextNthOnQuarterYear(value, nth) {
    return nextNthPerNmonth(value, nth, 3);
}
function nextNthOnHalfYear(value, nth) {
    return nextNthPerNmonth(value, nth, 6);
}
function nextNthOnYear(value, nth) {
    return nextNthPerNmonth(value, nth, 12);
}
function getNewDate(value) {
    return value instanceof Date ? value : new Date(typeof value == 'string' ? value.replace(/-/g, '/') : value);
}
module.exports = {
    getAutoFormatter: getAutoFormatter,
    getNewDate: getNewDate,
    format: format,
    nextMonday: nextMonday,
    nextNthPerNmonth: nextNthPerNmonth,
    nextNthOnMonth: nextNthOnMonth,
    nextNthOnQuarterYear: nextNthOnQuarterYear,
    nextNthOnHalfYear: nextNthOnHalfYear,
    nextNthOnYear: nextNthOnYear
} || module.exports;;